package org.yelongframework.excel.data;

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.collections4.CollectionUtils;

/**
 * 工作薄单元格数据集
 * 
 * @since 1.0.0
 */
public final class ExcelDatas {

	/** 工作表数据映射 */
	private final Map<Integer, SheetDatas> sheetDatasMap = new LinkedHashMap<>();

	// ==================================================构造器==================================================

	public ExcelDatas() {
	}

	/**
	 * @param sheetDatas 工作表数据集
	 */
	public ExcelDatas(SheetDatas sheetDatas) {
		add(sheetDatas);
	}

	/**
	 * @param sheetDatasList 工作表数据集集合
	 */
	public ExcelDatas(List<SheetDatas> sheetDatasList) {
		add(sheetDatasList);
	}

	// ==================================================添加==================================================

	/**
	 * 添加数据集
	 * 
	 * @param sheetDatas 数据集
	 */
	public void add(SheetDatas sheetDatas) {
		if (null == sheetDatas) {
			return;
		}
		sheetDatasMap.put(sheetDatas.getSheetIndex(), sheetDatas);
	}

	/**
	 * 添加数据集
	 * 
	 * @param sheetDatasList 数据集集合
	 */
	public void add(List<SheetDatas> sheetDatasList) {
		if (CollectionUtils.isEmpty(sheetDatasList)) {
			return;
		}
		sheetDatasList.forEach(this::add);
	}

	// ==================================================数据值==================================================

	/**
	 * 获取所有的数据值
	 * 
	 * @return 数据集
	 */
	public List<ExcelData> getExcelDataList() {
		List<ExcelData> excelDataList = new ArrayList<>();
		for (Entry<Integer, SheetDatas> entry : sheetDatasMap.entrySet()) {
			Integer sheetIndex = entry.getKey();
			List<SheetData> sheetDataList = entry.getValue().getSheetDataList();
			for (SheetData sheetData : sheetDataList) {
				excelDataList.add(new ExcelData(sheetIndex, sheetData));
			}
		}
		return excelDataList;
	}

	/**
	 * 获取指定工作表的数据值
	 * 
	 * @param sheetIndex 工作表索引
	 * @return 数据集
	 */
	public List<ExcelData> getExcelDataList(int sheetIndex) {
		SheetDatas sheetDatas = sheetDatasMap.get(sheetIndex);
		if (null == sheetDatas) {
			return null;
		}
		List<SheetData> sheetDataList = sheetDatas.getSheetDataList();
		List<ExcelData> excelDataList = new ArrayList<>(sheetDataList.size());
		for (SheetData sheetData : sheetDataList) {
			excelDataList.add(new ExcelData(sheetIndex, sheetData));
		}
		return excelDataList;
	}

	/**
	 * 获取指定工作表、行、列的单元格数据值
	 * 
	 * @param sheetIndex 工作表索引
	 * @param rowIndex   行索引
	 * @param colIndex   列索引
	 * @return 数据值
	 */
	public ExcelData getExcelData(int sheetIndex, int rowIndex, int colIndex) {
		SheetDatas sheetDatas = sheetDatasMap.get(sheetIndex);
		if (null == sheetDatas) {
			return null;
		}
		SheetData sheetData = sheetDatas.getSheetData(rowIndex, colIndex);
		if (null == sheetData) {
			return null;
		}
		return new ExcelData(sheetIndex, sheetData);
	}

	// ==================================================工作表数据映射==================================================

	/**
	 * @return 工作表数据映射。这个映射是不可变的
	 */
	public Map<Integer, SheetDatas> getSheetDatasMap() {
		return Collections.unmodifiableMap(sheetDatasMap);
	}

}
